require "jogador.lua"
require "class.lua"
require "objetoFixo.lua"
require "objetoMovel.lua"
require "constantes.lua"

function love.load()
	text = ""
	posicaoCamera = 0
	levelAtual = 2;
	isMenu = true
	isGameOver = false
	isEnd = false
	love.graphics.setFont(24)
	--inicia os graficos
	love.graphics.setBackgroundColor(0, 0, 0)
	love.graphics.setMode(LARGURA_TELA, ALTURA_TELA, false, false, 0)

	--inicia o mundo
	world = love.physics.newWorld(LARGURA_MUNDO,ALTURA_MUNDO)
	world:setGravity(0, GRAVIDADE)
	world:setMeter(METRO)

	-- define as funcoes a serem chamadas quando ocorrer uma colisao durante uma colisao e depois da colisao
	world:setCallbacks( onCollision, duringCollision, afterCollision )
	
	texturaFundo = love.graphics.newQuad(0, 0, LARGURA_MUNDO,ALTURA_MUNDO, LARGURA_MUNDO,ALTURA_MUNDO)
	texturaMenu = love.graphics.newQuad(0, 0, LARGURA_TELA,ALTURA_TELA, LARGURA_TELA,ALTURA_TELA)
	
	MUSICA:setLooping(true)
	--MUSICA:setVolume()
	
	--love.audio.setVolume()
	love.audio.play(MUSICA)	
	
	menuItens = {}
	menuItens[1] = "Comecar o Jogo";
	menuItens[2] = "Sair"
	indiceMenu = 1;
	
	seta = "-> ";
	
	--cria os vetores que irao comter os objetos do jogo
	jogadores = {}
	objetosMoveis = {}
	objetosFixos = {}

	jogadores[1] = jogador:new("jogador","w","s","a","d",100,500,60,96,10)
	jogadores[1]:setColData(jogadores[1])

	--cria o chao e o limite
	objetosFixos[1] = objetoFixo:new( "chao",LARGURA_MUNDO/2,ALTURA_MUNDO-ALTURA_CHAO/2,LARGURA_MUNDO,ALTURA_CHAO,2 )  --chao do cenario
	objetosFixos[1]:setColData(objetosFixos[1])
	objetosFixos[2] = objetoFixo:new( "limite",0,ALTURA_MUNDO/2,10,ALTURA_MUNDO,2 )  --limite do cenario
	objetosFixos[2]:setColData(objetosFixos[2])
	
	leitorLeveis("lvl2.txt")

end


function love.keypressed(key,unicode)
	if isMenu then
		if key == "up" then
			indiceMenu = (indiceMenu%2) + 1
		elseif key == "down" then
			indiceMenu = (indiceMenu%2) + 1
		elseif key == "return" then
			if indiceMenu == 1 then
				isMenu = false
			else
				isMenu = true
			end
		end
	end
end

function love.update(dt)
	if isMenu or isGameOver or isEnd then
		
	else
		world:update(dt) --atualiza o mundo

		--para cada objeto chama o funcao de atualizacao da sua classe
		for i,v in ipairs(jogadores) do
			jogadores[i]:update()
		end
		
		for i,v in ipairs(objetosMoveis) do
			objetosMoveis[i]:update()
		end
		
		-- Anda com a camera deixando o jogador sempre nos 40% centrais da tela
		if jogadores[1]:getBody():getX() > (LARGURA_TELA * 0.7) + posicaoCamera then
			posicaoCamera = jogadores[1]:getBody():getX() - ( LARGURA_TELA * 0.7 )
		elseif jogadores[1]:getBody():getX() < (LARGURA_TELA * 0.3) + posicaoCamera then
			posicaoCamera = jogadores[1]:getBody():getX() - ( LARGURA_TELA * 0.3 )
		end
			
		if posicaoCamera < 0 then
			posicaoCamera = 0  
		end
	end
end

function love.keyreleased(key)
	if isMenu or isGameOver or isEnd then
	else
		--para cada jogador chama o funcao de tratar soltar teclas da sua classe
		for i,v in ipairs(jogadores) do
			jogadores[i]:keyreleased(key)
		end
	end
end

function love.draw()
	if isMenu == true then
		love.graphics.drawq(IMG_MENU, texturaMenu, 0-posicaoCamera,0 )
		love.graphics.setFont("Gjallarhorn.ttf", 40)
		love.graphics.setColor(255, 255, 255)
		for i,v in ipairs(menuItens) do			
			if i == indiceMenu then
				love.graphics.print(seta,385,450+i*50);
				love.graphics.print(menuItens[i],410,450+i*50);
			else
				love.graphics.print(menuItens[i],410,450+i*50);
			end			
		end
		love.graphics.setFont("ADAMN.TTF", 80)
		love.graphics.print("TREASURE\n        OF\n NEWERTH",275,200);
		
		love.graphics.setColor(255, 255, 255)
	elseif isGameOver then
		love.graphics.setFont("Gjallarhorn.ttf", 60)
		love.graphics.setColor(255, 0, 0)
		love.graphics.print("Voce morreu agora nao existe\nninguem que possa deter Magina\nNewerth sera Destruido",200,200);
	elseif isEnd then
		love.graphics.setFont("Gjallarhorn.ttf", 60)
		love.graphics.setColor(255, 255, 255)
		love.graphics.print("Voce encontrou mais um tesouro\nAperte Enter para ir a proxima fase",100,200);
	else
		--teste
		love.graphics.setColor(255, 255, 255)
		love.graphics.print(text,100,170)
		
		love.graphics.drawq(FUNDO1, texturaFundo, 0-posicaoCamera,0 )
		
		--para cada objeto chama o funcao de desenho da sua classe
		for i,v in ipairs(jogadores) do
			jogadores[i]:draw()
		end
		
		for i,v in ipairs(objetosFixos) do
			if(v ~= 0)then objetosFixos[i]:draw() end
		end

		for i,v in ipairs(objetosMoveis) do
			objetosMoveis[i]:draw()
		end
	end

end

function onCollision( objetoA, objetoB, contact )
	-- chama a funcao para tratar colisao para os objetos envolvidos na colisao
	objetoA:trataColisao(objetoB,contact)
	objetoB:trataColisao(objetoA,contact)
	x,y = contact:getNormal()
	text = objetoA:getNome().." colide com "..objetoB:getNome().." com componentes xy da normal "..x.." "..y.."\n"
end

function duringCollision( objetoA, objetoB, contact )	
	
end

function leitorLeveis( nomeArquivo )
	fileL = love.filesystem.newFile( nomeArquivo )
	fileL:open('r')
	temp = 0
	temp1 = 0
	iterator = fileL:lines()
	while true do
		tipoObjeto = fileL:read(2)
		fileL:read(1)
		
		posicaoX = parserNumero( fileL )
		posicaoY = parserNumero( fileL )
		largura = parserNumero( fileL )
		altura = parserNumero( fileL )
		peso = parserNumero( fileL )
		torque = parserNumero( fileL )
		textura = parserNumero( fileL ) 

		nomeObjeto = fileL:read(3)
		
		if tipoObjeto == "OF" then
			objetosFixos[table.getn(objetosFixos) + 1] = objetoFixo:new( nomeObjeto,posicaoX,posicaoY,largura,altura,textura )						
			objetosFixos[table.getn(objetosFixos)]:setColData(objetosFixos[table.getn(objetosFixos)])
		elseif tipoObjeto == "OM" then
			objetosMoveis[table.getn(objetosMoveis) + 1] = objetoMovel:new( nomeObjeto,posicaoX,posicaoY,largura,altura,peso,torque,textura )
			objetosMoveis[table.getn(objetosMoveis)]:setColData(objetosMoveis[table.getn(objetosMoveis)])
		elseif tipoObjeto == "JO" then
			jogadores[table.getn(jogadores) + 1] = jogador:new("jogador","up","down","left","right",posicaoX,posicaoY,24,24,10)
			jogadores[table.getn(jogadores)]:setColData(jogadores[table.getn(jogadores)])
		end
		
		
		
		if (not iterator()) then
			break
		end
	end
	fileL:close()
end

function parserNumero( fileL )
	pontoFlutuante = false
	temp = 0
	temp1 = 0
	temp2 = 10
	while true do
		temp1 = fileL:read(1)
		if ( (pontoFlutuante) and (not isDigit(temp1) ) ) then
			break
		end
		
		if( not(pontoFlutuante) and (not isDigit(temp1) ) and (temp1 ~= ".") ) then
			break
		end
		
		if( temp1 == "." )then
			pontoFlutuante = true
			temp1 = fileL:read(1)
			if not ifDigit(temp1) then
				break
			end
		end		
		
		if ( not pontoFlutuante ) then
			temp = temp*10+temp1
		else
			temp = temp+temp1/temp2
			temp2 = temp2 * 10
		end
	end
	return temp
end

function isDigit( n )
	if n == "0" or n == "1" or n == "2" or n == "3" or n == "4" or n == "5" or n == "6" or n == "7" or n == "8" or n == "9" then
		return true
	else
		return false
	end
end

function reseta( lvl )
--inicia o mundo
	world:setGravity(0, GRAVIDADE)
	world:setMeter(METRO)

	-- define as funcoes a serem chamadas quando ocorrer uma colisao durante uma colisao e depois da colisao
	world:setCallbacks( onCollision, duringCollision, afterCollision )
	for i,v in ipairs(jogadores) do
		jogadores[i]:destroi()
		jogadores[i] = nil
	end
	for i,v in ipairs(objetosFixos) do
		objetosFixos[i]:destroi()	
		objetosFixos[i] = nil
	end
	for i,v in ipairs(objetosMoveis) do
		objetosMoveis[i]:destroi()
		objetosMoveis[i] = nil
	end
		
	jogadores[1] = jogador:new("jogador","w","s","a","d",100,500,60,96,10)
	jogadores[1]:setColData(jogadores[1])

	--cria o chao e o limite
	objetosFixos[1] = objetoFixo:new( "chao",LARGURA_MUNDO/2,ALTURA_MUNDO-ALTURA_CHAO/2,LARGURA_MUNDO,ALTURA_CHAO,2 )  --chao do cenario
	objetosFixos[1]:setColData(objetosFixos[1])
	objetosFixos[2] = objetoFixo:new( "limite",0,ALTURA_MUNDO/2,10,ALTURA_MUNDO,2 )  --limite do cenario
	objetosFixos[2]:setColData(objetosFixos[2])

	
	nomeArq = "lvl"..lvl..".txt"
	leitorLeveis( nomeArq )

end
	